/**
  ******************************************************************************
  * @file     SD93F115B_spi.c
  * @author   TEST TEAM 												    	
  * @version  v0															    	
  * @date     Septemper 2022												    	
  * @brief
  *
  * Copyright (C) 2022  Hangzhou SDIC Microelectronics Co., Ltd
**********************************************************************************/


/******************Includes******************/    
#include "SD93F115B_spi.h"
#include "SD93F115B_rcc.h"

/*---------------------------------------------------
 * 函数功能：SPI初始化
 * 入口参数：None
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *-------------------------------------------------*/
void SPI_DeInit(void)
{
	RCC_APBPeriphResetCmd(RCC_APBPeriph_SPI, ENABLE);
	RCC_APBPeriphResetCmd(RCC_APBPeriph_SPI, DISABLE); 
}

/*-------------------------------------------------
 * 函数功能：SPI初始化
 * 入口参数：SPI_InitStruct: pointer to a SPI_InitStruct structure that
 *           contains the configuration information for the specified SPI peripheral.
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *-------------------------------------------------*/
void SPI_Init(SPI_InitTypeDef* SPI_InitStruct)
{
	uint32_t tmpreg = 0;
	/* Check the parameters */
	assert_param(IS_SPI_Mode(SPI_InitStruct->SPI_Mode));
	assert_param(IS_SPI_NSS(SPI_InitStruct->SPI_NSS));

	assert_param(IS_SPI_BaudRate_Prescaler(SPI_InitStruct->SPI_BaudRatePrescaler));
	
    assert_param(IS_SPI_Data_Size(SPI_InitStruct->SPI_DataSize));
	
	assert_param(IS_SPI_CPOL(SPI_InitStruct->SPI_CPOL));
	assert_param(IS_SPI_CPHA(SPI_InitStruct->SPI_CPHA));

	assert_param(IS_SPI_FIRST_BIT(SPI_InitStruct->SPI_FirstBit));

	tmpreg = SPI->CR & 0xFFFF0000;
  
	tmpreg|= (uint32_t) (SPI_InitStruct->SPI_Mode|SPI_InitStruct->SPI_NSS|(SPI_InitStruct->SPI_BaudRatePrescaler<<3)|(SPI_InitStruct->SPI_DataSize<<7)|      
						 SPI_InitStruct->SPI_CPOL|SPI_InitStruct->SPI_CPHA|SPI_InitStruct->SPI_FirstBit);                                     
		
	SPI->CR = tmpreg;
	
} 

/*---------------------------------------
 * 函数功能：SPI使能
 * 入口参数：NewState: ENABLE或者DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *--------------------------------------*/
void SPI_Cmd(FunctionalState NewState)
{
	/* Check the parameters */
	assert_param(IS_FUNCTIONAL_STATE(NewState));

	if (NewState != DISABLE)
	{
		SPI->CR |= SPI_CR_SPIEN;
	}
	else
	{
		SPI->CR &= (uint32_t)~(SPI_CR_SPIEN);
	}
	
} 

/*---------------------------------------------------
 * 函数功能：使能NSS引脚输出，即使能SPI的片选CS信号
 * 入口参数：NewState: ENABLE或者DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *---------------------------------------------------*/
void SPI_NSSOutputCmd(FunctionalState NewState)
{
	/* Check the parameters */
	assert_param(IS_FUNCTIONAL_STATE(NewState));
	
	if (NewState != DISABLE)
	{
		SPI->CR |= SPI_CR_SSOE;
	}
	else
	{
		SPI->CR &= (uint32_t)~(SPI_CR_SSOE);
	}
}

/*--------------------------------------------------
 * 函数功能：SPI的NSS脉冲管理
 * 入口参数：NewState: ENABLE或者DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *-------------------------------------------------*/
void SPI_NSSPulseModeCmd(FunctionalState NewState)
{
	/* Check the parameters */
	assert_param(IS_FUNCTIONAL_STATE(NewState));
	
	if (NewState != DISABLE)
	{
		SPI->CR |= SPI_CR_NSSP;
	}
	else
	{
		SPI->CR &= (uint32_t)~(SPI_CR_NSSP);    
	}
}
  
 /*--------------------------------------------------------
 * 函数功能：使能内部NSS信号输出
 * 入口参数：NewState: ENABLE或者DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *--------------------------------------------------------*/
void SPI_NSSInternalSoftwareCmd(FunctionalState NewState)
{
	/* Check the parameters */
	assert_param(IS_FUNCTIONAL_STATE(NewState));

	if (NewState != DISABLE)
	{
		SPI->CR |= SPI_CR_SSI;
	}
	else
	{
		SPI->CR &= (uint32_t)~SPI_CR_SSI;
	}
	
} 
/*-------------------------------------------------------------
 * 函数功能：SPI中断配置
 * 入口参数：SPI_IT: SPI_IT_RXNEIE,SPI_IT_TXEIE,SPI_IT_OVRIE,SPI_IT_UDRIE,SPI_IT_MODFIE
 *			 NewState: ENABLE或者DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *------------------------------------------------------------*/
void SPI_ITConfig(uint32_t SPI_IT, FunctionalState NewState)
{

	/* Check the parameters */
	assert_param(IS_FUNCTIONAL_STATE(NewState));
	assert_param(IS_SPI_ITSource(SPI_IT));
	
	if(NewState != DISABLE)
	{
		SPI->CR |= SPI_IT;
	}
	else
	{
		SPI->CR &= (uint32_t)~(SPI_IT);
	}
	
} 
 
/*---------------------------------------------
 * 函数功能：读SPI中断状态
 * 入口参数：SPI_Flag: SPI_Flag_RXNE,SPI_Flag_TXE,SPI_Flag_OVR,SPI_Flag_UDR,SPI_Flag_MODF
 * 出口参数：None
 * 返回值  ：SPI中断状态 bitstatus
 * 编写日期：
 * 作者    ：
 *---------------------------------------------*/
ITStatus SPI_GetITStatus(uint8_t SPI_Flag)

{
	/* Check the parameters */
	assert_param(IS_SPI_ITFlag(SPI_Flag));
	
	ITStatus bitstatus = RESET;	
	
	if ((SPI->SR & SPI_Flag) != RESET)
	{
		bitstatus = SET;
	}
	else
	{
		bitstatus = RESET;
	}

	return bitstatus;		
}

/*-------------------------------------------------
 * 函数功能：读SPI标志位状态
 * 入口参数：SPI_Flag: SPI_Flag_RXNE,SPI_Flag_TXE,SPI_Flag_OVR,SPI_Flag_UDR,SPI_Flag_MODF,SPI_Flag_BSY
 * 出口参数：None
 * 返回值  ：SPI中断状态 bitstatus
 * 编写日期：
 * 作者    ：
 *-------------------------------------------------*/
FlagStatus SPI_GetFlagStatus(uint8_t SPI_Flag)
{
	/* Check the parameters */
	assert_param(IS_SPI_StatusFlag(SPI_Flag));
	
	FlagStatus bitstatus = RESET;

	if ((SPI->SR & SPI_Flag) != RESET)
	{
		bitstatus = SET;
	}
	else
	{

		bitstatus = RESET;
	}
	
	return  bitstatus;	
}

/*-------------------------------------------
 * 函数功能：清零SPI标志位
 * 入口参数：SPI_Flag: SPI_Flag_OVR,SPI_Flag_UDR,SPI_Flag_MODF
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *------------------------------------------*/
void SPI_ClearFlag(uint8_t SPI_Flag)
{
	/* Check the parameters */
	assert_param(IS_SPI_ClearFlag(SPI_Flag));

	SPI->SR |= SPI_Flag;	
}
 
/*--------------------------------------
 * 函数功能：SPI发送8~32位数据
 * 入口参数：8~32位数据 Data
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *--------------------------------------*/
void SPI_SendData(uint32_t Data)   
{	
	SPI->DR = Data;	
}

/*-----------------------------
 * 函数功能：SPI接收8位数据
 * 入口参数：None
 * 出口参数：None
 * 返回值  ：8~32位数据 Data
 * 编写日期：
 * 作者    ：
 *------------------------------*/
uint32_t SPI_ReceiveData(void)
{
  return  SPI->DR;	
}
 




/****************************END OF FILE****************************/